//创建日期:2022-03-23
#include <iostream>
#include <cstring>
using namespace std;
// CD信息类
class CD
{
public:
    //构造函数
    CD(string name, string songs[])
    {
        singer = name;
        for (int i = 0; i < 6; i++)
        {
            this->songs[i] = songs[i];
        }
    }
    // 获得歌手的名称
    string getSinger()
    {
        return singer;
    }
    // 获得某首歌的歌名
    string getSong(int index)
    {
        return songs[index];
    }
    // 列出CD的内容
    void listSongs()
    {
        cout << "Singer: " << singer << endl;
        for (int i = 0; i < 6; i++)
        {
            cout << i + 1 << ". " << songs[i] << endl;
        }
    }

private:
    string singer;   // 歌手的名字。
    string songs[6]; // 每张专辑6首歌的名字。
};
// CD播放类
class CDPlayer
{
public:
    CDPlayer()
    {
        cd = NULL;
        cdIn = false;
    }

    /*提供给用户一个菜单，通过这个菜单，用户可以选择：
    1. 插入CD
    2. 播放CD
    3. 弹出CD
    0. 关机   */
    //菜单
    void showMenu();
    /*插入CD. void insertCD(CD* cd)，形参是指向CD对象的指针。如果CDPlayer中已经有CD，提示先取出CD；如果CDPlayer中没有CD，显示插入了哪位歌星的CD。*/
    void insertCD(CD *cd);

    /*弹出CD. CD *ejectCD()，返回值是指向该CD对象的指针。如果CDPlayer中已经有CD，显示弹出了哪位歌星的CD，返回该CD的指针；如果CDPlayer中没有CD，提示CDPlayer中没有CD，返回NULL。*/
    CD *ejectCD();
    /*播放CD。如果CDPlayer中已经有CD，显示正在播放哪位歌星的CD，并打印CD中歌曲的清单；如果CDPlayer中没有CD，显示CDPlayer中没有CD，并提示用户插入CD。*/
    void play();

private:
    /* 插入CDPlayer中的CD，它是指向CD对象的指针。没有CD时，为null。使用指针，很好地模拟 了CD对象不是播放器的一部分，播放器只是读取放入其中的CD的内容。*/
    CD *cd;
    bool cdIn; // CDPlayer中是否已经插入CD
};
//主函数
int main()
{
    string name;
    string songs[6];
    cout << "The CD is in manufacturing..." << endl;
    // 输入歌手名字
    cout << "  Singer's Name: ";
    cin >> name; // 输入：周杰伦

    // 输入该歌手的六首歌名（青花瓷、菊花台、双节棍等）
    for (int i = 0; i < 6; i++)
    {
        cout << "  song" << (i + 1) << "#: ";
        cin >> songs[i];
    }

    CD cd(name, songs); //制造CD

    CDPlayer player;   //制造CDplayer
    player.showMenu(); //生成播放机的按钮
    int flag;
    while (1)
    {
        cout << "Please enter your choice of serial number: ";
        cin >> flag;
        if (flag == 0)
            break;
        switch (flag)
        {
        case 1:
            player.play(); //播放cd
            break;
        case 2:
            player.insertCD(&cd); //插入cd
            break;
        case 3:
            player.ejectCD(); //弹出cd
            break;
        default:
            break;
        }
    }

    return 0;
}
//菜单
void CDPlayer::showMenu()
{
    cout << "*********************************" << endl;
    cout << "*  1. playCD                       *" << endl;
    cout << "*  2. insertCD                      *" << endl;
    cout << "*  3. ejectCD                      *" << endl;
    cout << "*  0. shutdown                     *" << endl;
    cout << "*********************************" << endl;
}
//插入CD
void CDPlayer::insertCD(CD *cd)
{
    if (cdIn)
        cout << "Please take out the CD first." << endl; //请先取出cd
    else
    {
        this->cd = cd;
        cout << "You have inserted the " << cd->getSinger() << " ID..." << endl;
        cdIn = true;
    }
}
//弹出CD
CD *CDPlayer::ejectCD()
{
    CD *res = NULL;
    if (cdIn)
    {
        res = cd;
        cout << "You've had a pop-up " << cd->getSinger() << "CD..." << endl;
        cdIn = false;
    }
    else
    {
        cout << "CDPlayer haven't any CD!" << endl;
    }
    return res;
}
//播放CD
void CDPlayer::play()
{
    if (cdIn)
    {
        cout << "The currently play CD is " << cd->getSinger() << endl;
        cd->listSongs();
    }
    else
    {
        cout << "CDPlayer hasn't any CD! You need to insert CD in it." << endl;
    }
}
